/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hispamail;

import Formularios.JFrameInicio;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 *
 * @author Miguel Cenalmor Sanchidrián
 */
public class CSendmail2 {

    private String destinatariosTO;
    private String destinatariosCC;
    private String destinatariosBCC;
    private String asunto;
    private String adjuntos;//ficheros adjuntos
    private String texto;

    private String pak;

    public CSendmail2(
            String destinatariosTO,
            String destinatariosCC,
            String destinatariosBCC,
            String asunto,
            String adjuntos,
            String texto) {

        this.destinatariosTO = destinatariosTO;
        this.destinatariosCC = destinatariosCC;
        this.destinatariosBCC = destinatariosBCC;
        this.asunto = asunto;
        this.adjuntos = adjuntos;
        this.texto = texto;

        Calendar cal = Calendar.getInstance(); //obtiene la fecha de hoy

        this.pak = cal.get(Calendar.YEAR) + ""
                + Integer.toString(cal.get(Calendar.MONTH) + 1)
                + cal.get(Calendar.DAY_OF_MONTH)
                + cal.get(Calendar.HOUR_OF_DAY)
                + cal.get(Calendar.MINUTE)
                + cal.get(Calendar.SECOND)
                + ".xml";

    }

    public void mandacorreo() throws AddressException, MessagingException, FileNotFoundException, IOException {
        Properties datos = new Properties();

        int pos = getRemitente().indexOf('@', 0);

        String smtp = "smtp." + getRemitente().substring(pos + 1, getRemitente().length());
        datos.setProperty("mail.smtp.host", smtp);
        //datos.setProperty("mail.smtp.host", "smtp.gmail.com");

        datos.setProperty("mail.smtp.starttls.enable", "true"); //si usa TLS o no

        datos.setProperty("mail.smtp.port", "587");//465 o 587 tls

        pos = getRemitente().indexOf('@', 0);
        String user = getRemitente().substring(0, pos);
        datos.setProperty("mail.smtp.user", user);
        //datos.setProperty("mail.smtp.user", "lfmservidor");//para un remitente=lfmservidor@gmail.com

        datos.setProperty("mail.smtp.auth", "true");
        datos.setProperty("mail.smtps.auth ", "true");
        datos.put("mail.debug", "true");  //para que nos muestre en detalle el proceso

        datos.put("mail.smtp.socketFactory.port", 587);//465 ssl, 587 tls
        datos.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        Session sesion = Session.getDefaultInstance(datos);
        sesion.setDebug(true);

        MimeMultipart correo = new MimeMultipart();
        //***** parte 1
        BodyPart textoBody = new MimeBodyPart();
        //texto.setText("texto del mensaje ... y adjunto fichero");
        textoBody.setText(this.getTexto());

        correo.addBodyPart(textoBody);

        //***** parte 2 -> ficheros adjuntos
        //Separamos los archivos por ; hacemos split y recorremos la matriz 
        //para ir añadiendo todos los archivos
        String varios[] = getAdjuntos().split(";");
        for (int i = 0; i < varios.length; i++) {
            BodyPart archivo = new MimeBodyPart();

            if (varios[i].length() == 0) {
                continue;
            }

            setAdjuntos(varios[i]);//nombre del adjunto con ruta
            archivo.setDataHandler(new DataHandler(new FileDataSource(getAdjuntos())));
            int last = getAdjuntos().lastIndexOf('\\');
            setAdjuntos(getAdjuntos().substring(last + 1));
            //nombre del archivo a enviar/descargar le hemos quitado la ruta 
            //ya que solo indica el nombre
            archivo.setFileName(getAdjuntos());
            correo.addBodyPart(archivo);
        }

        //***** parte 3
        // varios destinatarios
        //La misma sesion que ya hemos definido arriba
        MimeMessage mensaje = new MimeMessage(sesion);

        mensaje.setFrom(new InternetAddress(getRemitente())); //remitente (1 solo)
        //mensaje.setFrom(new InternetAddress("lfmservidor@gmail.com")); //remitente (1 solo)

        //Listas de Destinatarios TO, CC, BCC
        String variosTO[] = getDestinatariosTO().split(";");
        for (int i = 0; i < variosTO.length; i++) {
            if (variosTO[i].length() > 0) {
                mensaje.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(variosTO[i])); //destinatarios (1 o mas)
            }
        }

        String variosCC[] = getDestinatariosCC().split(";");
        for (int i = 0; i < variosCC.length; i++) {
            if (variosCC[i].length() > 0) {
                mensaje.addRecipient(Message.RecipientType.CC,
                        new InternetAddress(variosCC[i])); //destinatarios (1 o mas)
            }
        }

        String variosBCC[] = getDestinatariosBCC().split(";");
        for (int i = 0; i < variosBCC.length; i++) {
            if (variosBCC[i].length() > 0) {
                mensaje.addRecipient(Message.RecipientType.BCC,
                        new InternetAddress(variosBCC[i])); //destinatarios (1 o mas)
            }
        }

        mensaje.setSubject(this.getAsunto());
        //mensaje.setSubject("asunto del correo");

        mensaje.setText(this.getTexto());
        //mensaje.setText("texto del mensaje ... y adjunto fichero");

        //el multipart unido con todas sus partes
        mensaje.setContent(correo);

        Transport t = sesion.getTransport("smtp");
        /*
        XStream xs = new XStream((ReflectionProvider) new MimeMessage(sesion));
        xs.alias("msg", MimeMessage.class);
        String xml = xs.toXML(mensaje);
        FileOutputStream flip = null;
        String currentDir = System.getProperty("user.dir") + "\\mail";
*/
        boolean ret = true;
        try {
            t.connect(user, getPass());
            t.sendMessage(mensaje, mensaje.getAllRecipients());
 /*           flip = new FileOutputStream(currentDir
                    + "\\mail\\"
                    + this.pak + ".xml");
            xs.alias("correo", CSendmail2.class);
            xs.toXML(mensaje, flip);
   */
            } catch (MessagingException e) {

        } finally {
            t.close();
            //flip.close();
        }

    }//mandacorreo

    /**
     * @return the destinatariosTO
     */
    public String getDestinatariosTO() {
        return destinatariosTO;
    }

    /**
     * @param destinatariosTO the destinatariosTO to set
     */
    public void setDestinatariosTO(String destinatariosTO) {
        this.destinatariosTO = destinatariosTO;
    }

    /**
     * @return the destinatariosCC
     */
    public String getDestinatariosCC() {
        return destinatariosCC;
    }

    /**
     * @param destinatariosCC the destinatariosCC to set
     */
    public void setDestinatariosCC(String destinatariosCC) {
        this.destinatariosCC = destinatariosCC;
    }

    /**
     * @return the destinatariosBCC
     */
    public String getDestinatariosBCC() {
        return destinatariosBCC;
    }

    /**
     * @param destinatariosBCC the destinatariosBCC to set
     */
    public void setDestinatariosBCC(String destinatariosBCC) {
        this.destinatariosBCC = destinatariosBCC;
    }

    /**
     * @return the asunto
     */
    public String getAsunto() {
        return asunto;
    }

    /**
     * @param asunto the asunto to set
     */
    public void setAsunto(String asunto) {
        this.asunto = asunto;
    }

    /**
     * @return the adjuntos
     */
    public String getAdjuntos() {
        return adjuntos;
    }

    /**
     * @param adjuntos the adjuntos to set
     */
    public void setAdjuntos(String adjuntos) {
        this.adjuntos = adjuntos;
    }

    /**
     * @return the texto
     */
    public String getTexto() {
        return texto;
    }

    /**
     * @param texto the texto to set
     */
    public void setTexto(String texto) {
        this.texto = texto;
    }

    /**
     * @return the pak
     */
    public String getPak() {
        return pak;
    }

    /**
     * @param pak the pak to set
     */
    public void setPak(String pak) {
        this.pak = pak;
    }

    public String getRemitente() {
        return JFrameInicio.remitente;
    }

    private String getPass() {
        return JFrameInicio.pass;
    }
}
